package com.maxatime.web.controller;

import com.maxatime.pojo.entity.Xiaofei;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;

/**
 * @ClassName User
 * @Description ssb读取excel文件，将用户数据放到一个List中
 * @Author 33117
 * @Date 2024/7/29 8:34
 **/

public class User {

       public static void main(String[] args) {
        // Excel文件路径path/to/your/excel/file.xlsx
        String filePath = "C:\\Users\\saxas\\Desktop\\用户信息.xlsx";
        // 读取Excel文件并存储数据到List中
        List<List<Object>> data = readExcel(filePath);
        //将data格式[[],[]]保存到List<Xiaofei>集合中
        List<Xiaofei> xiaofeiList = convertToXiaofeiList(data);
        // 将List<Xiaofei>转换为String[]
        String[] lines = new String[xiaofeiList.size()];
        for (int i = 0; i < xiaofeiList.size(); i++) {
            lines[i] = xiaofeiList.get(i).getName()+','+xiaofeiList.get(i).getEnterTime()+','+xiaofeiList.get(i).getConsumptionAmount()+','+xiaofeiList.get(i).getDiscountAmount(); // 使用Xiaofei的toString方法
        }
        // 输出数组以验证结果
        for (String line : lines) {
            System.out.println(line);
        }
        Map<String, Double[]> totals = calculateTotals(lines);
        // 输出结果
        for (Map.Entry<String, Double[]> entry : totals.entrySet()) {
            System.out.println(entry.getKey() + ": 消费总金额=" + entry.getValue()[0] + ", 优惠总金额=" + entry.getValue()[1]);
        }

           //初始金额为0元，累计增加
           double totalWednesdayConsumption = 0;
           // 遍历每一行
           for (String line : lines) {
               // 使用逗号分割字符串
               String[] parts = line.split(",");

               if (parts.length >= 3) { // 确保有足够的部分来包含日期和消费金额
                   try {
                       // 解析日期时间字符串（只取日期部分）
                       SimpleDateFormat sdf = new SimpleDateFormat("E MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
                       Date date = sdf.parse(parts[1].trim()); // 假设日期是第二个元素

                       // 这里我们实际上不需要完整的Date对象，因为我们只关心星期几
                       // 但为了演示，我们还是先解析它，然后获取星期几（作为整数）
                       // 注意：Java 8 引入了更好的日期时间API，但这里为了与你的示例保持一致，我们还是使用SimpleDateFormat
                       Calendar calendar = Calendar.getInstance();
                       calendar.setTime(date);
                       int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
                       // 在Java中，SUNDAY = 1, MONDAY = 2, ..., SATURDAY = 7
                       // 我们假设WEDNESDAY是4（但最好使用Calendar.WEDNESDAY常量）
                       if (dayOfWeek == Calendar.WEDNESDAY) {
                           // 累加消费金额（假设第三个元素是消费金额）
                           totalWednesdayConsumption += Double.parseDouble(parts[2].trim());
                       }

                   } catch (ParseException e) {
                       e.printStackTrace();
                   }
               }
           }
           // 打印结果
           System.out.println("所有星期三的用户消费总金额为: " + totalWednesdayConsumption);
    }

    //读取excel文件
    public static List<List<Object>> readExcel(String filePath) {
        List<List<Object>> data = new ArrayList<>();

        try (FileInputStream fis = new FileInputStream(filePath);
             Workbook workbook = new XSSFWorkbook(fis)) {

            Sheet sheet = workbook.getSheetAt(1); // 读取第一个工作表

            for (Row row : sheet) {
                List<Object> rowData = new ArrayList<>();
                for (Cell cell : row) {
                    Object value = null;
                    switch (cell.getCellType()) {
                        case STRING:
                            value = cell.getStringCellValue();
                            break;
                        case NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                value = cell.getDateCellValue();
                            } else {
                                value = cell.getNumericCellValue();
                            }
                            break;
                        case BOOLEAN:
                            value = cell.getBooleanCellValue();
                            break;
                        case FORMULA:
                            // 处理公式单元格（这里直接获取公式的计算结果，如果是一个数字）
                            if (DateUtil.isCellDateFormatted(cell)) {
                                value = cell.getDateCellValue();
                            } else {
                                value = cell.getNumericCellValue();
                            }
                            break;
                        case BLANK:
                            value = ""; // 或者使用null，根据你的需求
                            break;
                        default:
                            value = "未知类型";
                    }
                    rowData.add(value);
                }
                data.add(rowData);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        return data;
    }

    //将读取excel文件储存到List<Xiaofei>中
    public static List<Xiaofei> convertToXiaofeiList(List<List<Object>> data) {
        List<Xiaofei> xiaofeiList = new ArrayList<>();

        // 跳过标题行（如果data列表的第一个元素是标题行）
        if (!data.isEmpty() && data.get(0).size() == 4 && data.get(0).get(0) instanceof String) {
            data.remove(0); // 移除标题行
        }

        // 遍历数据行并转换
        for (List<Object> row : data) {
            if (row.size() == 4) {
                String name = (String) row.get(0);
                Date enterTime = (Date) row.get(1); // 或者转换为Date等类型
                Double consumptionAmount = (Double) row.get(2);
                Double discountAmount = (Double) row.get(3);

                Xiaofei xiaofei = new Xiaofei(name, enterTime, consumptionAmount, discountAmount);
                xiaofeiList.add(xiaofei);
            }
        }

        return xiaofeiList;
    }


    //统计消费总金额，优惠总金额
     public static Map<String, Double[]> calculateTotals(String[] lines) {
        Map<String, Double[]> totals = new HashMap<>();

        for (String line : lines) {
            String[] parts = line.split(",", 4); // 分割成四部分：用户名、日期、消费金额、优惠金额
            String name = parts[0];
            String dateString = parts[1].substring(0, parts[1].indexOf(' ')); // 去掉星期几的部分（如果需要）
            double consumptionAmount = Double.parseDouble(parts[2]);
            double discountAmount = Double.parseDouble(parts[3]);

            // 注意：这里我们没有实际使用日期字符串，因为题目只要求计算金额

            totals.putIfAbsent(name, new Double[]{0.0, 0.0});
            Double[] currentTotals = totals.get(name);
            currentTotals[0] += consumptionAmount; // 累加消费金额
            currentTotals[1] += discountAmount; // 累加优惠金额
        }

        return totals;
    }


}
